package model;


public class EC {
	
	private static int x=0;
	private static int y=0;
	public static int a;//椭圆曲线的参数a
	public static int b;//椭圆曲线的参数b
	public static int p;//椭圆曲线的模数p
	public static int xq;//椭圆曲线的生成元的横坐标x
	public static int yq;//椭圆曲线的生成元的纵坐标y
	
	public static int getA() {
		return a;
	}

	public static void setA(int a) {
		EC.a = a;
	}

	public static int getB() {
		return b;
	}

	public static void setB(int b) {
		EC.b = b;
	}

	public static int getP() {
		return p;
	}

	public static void setP(int p) {
		EC.p = p;
	}

	public static int getXq() {
		return xq;
	}

	public static void setXq(int xq) {
		EC.xq = xq;
	}

	public static int getYq() {
		return yq;
	}

	public static void setYq(int yq) {
		EC.yq = yq;
	}
	
	//计算a*x%b=1时，x的值
	/**
	 * a*x%b=1
	 * @return x
	 */
		public static int ExGcd(int a,int b){
			if (b==0){
				x=1;
				y=0;
				return a;
			}
			int r=ExGcd(b, a%b);
			int t=x;
			x=y;
			y=t-a/b*y;
			return x;
		}
		//计算a*b%c的值
		/**
		 * @return a*b%c
		 */
		public static int fun2(int a,int b,int c){
			int res= 1;
			while(b!=0){
				if ((b&1)==1){
					res=res*a%c;
					--b;
				}
				else{
					a=a*a%c;
					b>>=1;
				}
			}
			return  res;
		}

	/**
	 * 实现指定椭圆曲线上面两个点相加
	 * @param p1 ，椭圆曲线上的一个点
	 * @param p2，椭圆曲线上的另外一个点
	 * @return 两个点进行相加的结果点
	 */
	public Point addtwoPoint(Point p1,Point p2){
		if (p1==null||p2==null){
			return null;
		}
		Point respoint=new Point();
		int x1=Integer.parseInt(p1.getX());
		int y1=Integer.parseInt(p1.getY());
		int x2=Integer.parseInt(p2.getX());
		int y2=Integer.parseInt(p2.getY());
		int n=0;
		if (p1.getX().equals(p2.getX())&&p1.getY().equals(p2.getY())){
			//说明这两个点是同一个点
			int n1=3*x1*x1+a;
			int n2=2*y1;
			int i=0;
			
			do{
				i++;
				n=(n1*i)%p;
			}while (((n2*i)%p)!=1);
			
			
			
		}
		else if (x1==x2&&y1==-y2){
			//两个点互逆，相加结果为（0,0）
			respoint.setX("0");
			respoint.setY("0");
			return respoint;
		}
		else {
			//两个点既不相同，也不互逆
			int n1=0,n2=0;
			if (x1<x2){
				n1=y2-y1;
				n2=x2-x1;
			}
			else{
				n1=y1-y2;
				n2=x1-x2;
			}
			//判断n1的值是否为负数，如果是，则要进入对负数的求余运算
			if (n1<0){
				int temp=-n1;
				int i=0;
				do{
					i++;
					n=p-(temp*i)%p;
				}while (((n2*i)%p)!=1);
				
			}
			else {
				int i=0;
				do{
					i++;
					n=(n1*i)%p;
				}while (((n2*i)%p)!=1);
				
			}
		}
			//计算x3，和y3的值
			int x3=n*n-x1-x2;
			int y3=n*(x1-x3)-y1;
			int temp=0;
			if (x3<0){
				temp=-x3;
				temp=temp%p;
				x3=p-temp;
			}else
				x3=x3%p;
			
			if (y3<0){
				temp=-y3;
				temp=temp%p;
				y3=p-temp;
			}else
				y3=y3%p;
			
			respoint.setX(""+x3);
			respoint.setY(""+y3);
		return respoint;
	}
	
	/**
	 * 实现指定椭圆曲线上面点乘算法
	 * @param n，倍数
	 * @param p，点
	 * @return 结果点
	 */
	public Point dianchen(int n,Point p){
		if (n==1){
			return p;
		}
		Point resp=p;
		for (int i=0;i<n-1;i++){
			resp=this.addtwoPoint(resp, p);
		}
		return resp;
	}
	
	public static void main(String[] args) {
		EC ec=new EC();
		ec.a=1;
		ec.b=1;
		ec.p=23;
		ec.xq=1;
		ec.yq=1;
		Point p=new Point("7","2");
		Point pub=ec.dianchen(8, p);
		System.out.println(pub);
		int res=Integer.parseInt("F",16);
		System.out.println("res="+res);
		
		
		
	}
	
}